www.gusucode.com > Introductory Communication Systems Course Using SDR工具箱 > Introductory Communication Systems Course Using SDR/Lab04/generateComplexEnvelope_ASK_FSK_PSK.m

    %% generateComplexEnvelope_ASK_FSK_PSK.m
%   Generates a complex envelope for broadcasting with Ettus B200 USRP.
%   This version generates ASK, FSK, and PSK waveforms with
%   digital modulating signals.
%   The carrier signals are separated by 40kHz.
%
%   Cory J. Prust, Ph.D.
%   Last Modified:  8/16/2018

%%  USRP Configuration
%   The script generates the complex envelope sampled at 240kHz
%   So, the B200 must be configured for MasterClockRate/Interpolation = 240000.
%    e.g., MasterClockRate = 9600000 and Interpolation = 40 
clear all
close all

% sample rate
fs = 240e3;
T = 2; % will generate T second duration waveforms
t = 0:(1/fs):(T-1/fs);
N = length(t);

%% Generate ASK message signal
%  to keep things simple, ensure message is exactly T seconds long
fb_ASK = 1200; %bit rate (bits/sec)
Nb_ASK = fb_ASK * T; %number of bits
m_ASK = randi(2,1,Nb_ASK)-1; %generate bit sequence
m_ASKp = rectpulse(m_ASK,(fs/fb_ASK));

% generate ASK complex envelope
fi_ASK = 90e3;
z_ASK = m_ASKp.*exp(j*2*pi*fi_ASK*t);

%% Generate FSK message signal
%  to keep things simple, ensure message is exactly T seconds long
fb_FSK = 800; %bit rate (bits/sec)
Nb_FSK = fb_FSK * T; %number of bits
m_FSK = 2*randi(2,1,Nb_FSK)-3; %generate bit sequence
m_FSKp = rectpulse(m_FSK,(fs/fb_FSK));

% generate FSK complex envelope
mod = comm.FMModulator('SampleRate',fs,'FrequencyDeviation',3e3);
z_FSK = step(mod,m_FSKp').';
fi_FSK = 50e3;
z_FSK = z_FSK.*exp(j*2*pi*fi_FSK*t);


%% Generate PSK message signal
%  to keep things simple, ensure message is exactly T seconds long
fb_PSK = 600; %bit rate (bits/sec)
Nb_PSK = fb_PSK * T; %number of bits
m_PSK = 2*randi(2,1,Nb_PSK)-3; %generate bit sequence
m_PSKp = rectpulse(m_PSK,(fs/fb_PSK));

% generate PSK complex envelope
fi_PSK = 10e3;
z_PSK = m_PSKp.*exp(j*2*pi*fi_PSK*t);

%% form transmit waveform and normalize complex envelope
z = z_ASK + z_FSK + z_PSK;
z = z/max(abs(z)) * 0.8;  % ensure magnitude < 1 to prevent saturation in USRP

% time-domain plots
figure
hold on
plot(t,real(z))
plot(t,imag(z))
plot(t,abs(z))
plot(t,angle(z))
legend('real','imag','abs','angle')

% frequency-domain plot
f = -fs/2:(fs/N):(fs/2 - fs/N);
figure
plot(f,20*log10(abs(fftshift(fft(z)))));